package edu.ucsur.libreriaelsaber.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import edu.ucsur.libreriaelsaber.beans.UsuarioBean;

public class MySqlUsuarioDAO implements UsuarioDAO {

  public UsuarioBean getUsuario(String codigoUsuario) {
    String sql = "SELECT * FROM usuario WHERE codigo_usuario = ?";
    try {
      //1. Obtener la conexi�n
      Connection conn = DBConnection.getConnection();
      //2. Obtenemos la sentencia Java (PreparedStatement)
      PreparedStatement pstmt = conn.prepareStatement(sql);
      //-- 2.1. Setear los par�metros din�micos
      pstmt.setString(1, codigoUsuario);
      //3. Ejecutar la sentencia (se recupera en un cursor)
      ResultSet rs = pstmt.executeQuery();
      //4. Recorriendo el cursor
      if (rs.next()) {
        UsuarioBean usuario = new UsuarioBean();
        usuario.setCodigoUsuario(rs.getString("codigo_usuario"));
        usuario.setClave(rs.getString("clave"));
        usuario.setNombres(rs.getString("nombres"));
        usuario.setApellidos(rs.getString("apellidos"));
        usuario.setFechaNacimiento(rs.getDate("fecha_nacimiento"));
        usuario.setCorreo(rs.getString("correo"));
        usuario.setFoto(rs.getBytes("foto"));
        usuario.setSueldoAnual(rs.getFloat("sueldo_anual"));
        return usuario;
      }
      //5. Cerrando los recursos JDBC
      rs.close();
      pstmt.close();
      conn.close();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
    return null;
  }
  
  public List<UsuarioBean> getListaUsuariosPorFiltros(String filtroNombres, String filtroApellidos) {
    List<UsuarioBean> listaUsuarios = new ArrayList<UsuarioBean>();
    String sql = "SELECT * FROM usuario WHERE nombres like ? AND apellidos like ?";
    try {
      //1. Obtener la conexi�n
      Connection conn = DBConnection.getConnection();
      //2. Obtenemos la sentencia Java (PreparedStatement)
      PreparedStatement pstmt = conn.prepareStatement(sql);
      //-- 2.1. Setear los par�metros din�micos
      pstmt.setString(1, "%" + filtroNombres + "%");
      pstmt.setString(2, "%" + filtroApellidos + "%");
      //3. Ejecutar la sentencia (se recupera en un cursor)
      ResultSet rs = pstmt.executeQuery();
      //4. Recorriendo el cursor
      while (rs.next()) {
        UsuarioBean usuario = new UsuarioBean();
        usuario.setCodigoUsuario(rs.getString("codigo_usuario"));
        usuario.setClave(rs.getString("clave"));
        usuario.setNombres(rs.getString("nombres"));
        usuario.setApellidos(rs.getString("apellidos"));
        usuario.setFechaNacimiento(rs.getDate("fecha_nacimiento"));
        usuario.setCorreo(rs.getString("correo"));
        usuario.setFoto(rs.getBytes("foto"));
        usuario.setSueldoAnual(rs.getFloat("sueldo_anual"));
        listaUsuarios.add(usuario);
      }
      //5. Cerrando los recursos JDBC
      rs.close();
      pstmt.close();
      conn.close();
      //6. Devolver la lista
      return listaUsuarios;
    } catch (Exception ex) {
      ex.printStackTrace();
    }
    return null;
  }

  public void insertar(UsuarioBean usuario) {
    String sql = "INSERT INTO usuario ( codigo_usuario, clave, nombres, apellidos, fecha_nacimiento, correo, foto, sueldo_anual ) ";
    sql += " VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) ";
    try {
      //1. Obtener la conexi�n
      Connection conn = DBConnection.getConnection();
      //2. Obtenemos la sentencia Java (PreparedStatement)
      PreparedStatement pstmt = conn.prepareStatement(sql);
      //-- 2.1. Setear los parametros dinamicos
      pstmt.setString(1, usuario.getCodigoUsuario());
      pstmt.setString(2, usuario.getClave());
      pstmt.setString(3, usuario.getNombres());
      pstmt.setString(4, usuario.getApellidos());
      pstmt.setDate(5, new java.sql.Date(usuario.getFechaNacimiento().getTime()));
      pstmt.setString(6, usuario.getCorreo());
      pstmt.setBytes(7, usuario.getFoto());
      pstmt.setFloat(8, usuario.getSueldoAnual());
      //3. Ejecutar la sentencia (se recupera en un cursor)
      pstmt.executeUpdate();
      //7. Cerrando los recursos JDBC
      pstmt.close();
      conn.close();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
  
  public void actualizar(UsuarioBean usuario) {
    String sql = "UPDATE usuario SET clave = ?, nombres = ?, apellidos = ?, fecha_nacimiento = ?, correo = ?, foto = ?, sueldo_anual = ? WHERE codigo_usuario = ? ";
    try {
      //1. Obtener la conexi�n
      Connection conn = DBConnection.getConnection();
      //2. Obtenemos la sentencia Java (PreparedStatement)
      PreparedStatement pstmt = conn.prepareStatement(sql);
      //-- 2.1. Setear los parametros dinamicos
      pstmt.setString(1, usuario.getClave());
      pstmt.setString(2, usuario.getNombres());
      pstmt.setString(3, usuario.getApellidos());
      pstmt.setDate(4, new java.sql.Date(usuario.getFechaNacimiento().getTime()));
      pstmt.setString(5, usuario.getCorreo());
      pstmt.setBytes(6, usuario.getFoto());
      pstmt.setFloat(7, usuario.getSueldoAnual());
      pstmt.setString(8, usuario.getCodigoUsuario());
      //3. Ejecutar la sentencia (se recupera en un cursor)
      pstmt.executeUpdate();
      //7. Cerrando los recursos JDBC
      pstmt.close();
      conn.close();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  public void eliminar(String codigoUsuario) {
    String sql = "DELETE FROM usuario WHERE codigo_usuario = ? ";
    try {
      //1. Obtener la conexi�n
      Connection conn = DBConnection.getConnection();
      //2. Obtenemos la sentencia Java (PreparedStatement)
      PreparedStatement pstmt = conn.prepareStatement(sql);
      //-- 2.1. Setear los par�metros din�micos
      pstmt.setString(1, codigoUsuario);
      //3. Ejecutar la sentencia (se recupera en un cursor)
      pstmt.executeUpdate();
      //7. Cerrando los recursos JDBC
      pstmt.close();
      conn.close();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
  
}
